{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## LunarLanderContinuous-v2 (2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "threshold:  200\n",
      "Size of each action: 2\n",
      "Each observes a state with length: {} 8\n",
      "The state for the first agent looks like: -0.00059156417\n"
     ]
    }
   ],
   "source": [
    "import gym\n",
    "import random\n",
    "import torch\n",
    "import numpy as np\n",
    "\n",
    "import time\n",
    "from ddpg_agent_2 import Agent, ReplayBuffer, device\n",
    "from collections import deque\n",
    "\n",
    "start_timestep=1e4\n",
    "\n",
    "from  collections  import deque\n",
    "\n",
    "env = gym.make('LunarLanderContinuous-v2')\n",
    "seed = 0\n",
    "env.seed(seed)\n",
    "torch.manual_seed(seed)\n",
    "np.random.seed(seed)\n",
    "\n",
    "state = env.reset()\n",
    "state_dim = env.observation_space.shape[0]\n",
    "action_dim = env.action_space.shape[0] \n",
    "max_action = float(env.action_space.high[0])\n",
    "threshold = env.spec.reward_threshold\n",
    "print('threshold: ', threshold)\n",
    "\n",
    "print('Size of each action:', action_dim)\n",
    "# examine the state space \n",
    "print('Each observes a state with length: {}', state_dim)\n",
    "print('The state for the first agent looks like:', state[0])\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "agent = Agent(state_size=state_dim, action_size=action_dim, random_seed=8)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode 10 Score: -243.00 Average Score: -499.66, Time: 00:00:04 ***    \n",
      "Episode 20 Score: -221.11 Average Score: -388.73, Time: 00:00:07 ***    \n",
      "Episode 30 Score: -283.71 Average Score: -368.27, Time: 00:00:12 ***    \n",
      "Episode 40 Score: -214.29 Average Score: -356.48, Time: 00:00:17 ***    \n",
      "Episode 50 Score: -694.16 Average Score: -419.16, Time: 00:00:22 ***    \n",
      "Episode 60 Score: -852.83 Average Score: -479.78, Time: 00:00:29 ***    \n",
      "Episode 70 Score: -103.90 Average Score: -478.58, Time: 00:00:33 ***    \n",
      "Episode 80 Score: -423.87 Average Score: -461.26, Time: 00:00:39 ***    \n",
      "Episode 90 Score: -225.83 Average Score: -434.01, Time: 00:00:43 ***    \n",
      "Episode 100 Score: -225.10 Average Score: -405.73, Time: 00:00:48 ***    \n",
      "Episode 110 Score: -290.55 Average Score: -373.16, Time: 00:00:52 ***    \n",
      "Episode 120 Score: -200.32 Average Score: -365.94, Time: 00:00:57 ***    \n",
      "Episode 130 Score: -204.53 Average Score: -354.72, Time: 00:01:01 ***    \n",
      "Episode 140 Score: -121.82 Average Score: -344.01, Time: 00:01:06 ***    \n",
      "Episode 150 Score: -366.65 Average Score: -295.42, Time: 00:01:10 ***    \n",
      "Episode 160 Score: -270.82 Average Score: -237.17, Time: 00:01:15 ***    \n",
      "Episode 170 Score: -48.96 Average Score: -207.07, Time: 00:01:20 ***    \n",
      "Episode 180 Score: -241.33 Average Score: -188.99, Time: 00:01:24 ***    \n",
      "Episode 190 Score: -133.51 Average Score: -182.95, Time: 00:01:29 ***    \n",
      "Episode 200 Score: -231.05 Average Score: -187.88, Time: 00:01:33 ***    \n",
      "Episode 210 Score: -190.48 Average Score: -187.88, Time: 00:01:38 ***    \n",
      "Episode 220 Score: -131.16 Average Score: -181.17, Time: 00:01:42 ***    \n",
      "Episode 230 Score: -157.05 Average Score: -177.08, Time: 00:01:47 ***    \n",
      "Episode 240 Score: -20.65 Average Score: -168.26, Time: 00:01:52 ***    \n",
      "Episode 250 Score: -116.39 Average Score: -164.04, Time: 00:01:56 ***    \n",
      "Episode 260 Score: -276.16 Average Score: -160.23, Time: 00:02:03 ***    \n",
      "Episode 270 Score: -212.00 Average Score: -172.26, Time: 00:02:22 ***    \n",
      "Episode 280 Score: -188.56 Average Score: -175.57, Time: 00:02:32 ***    \n",
      "Episode 290 Score: -256.07 Average Score: -183.96, Time: 00:02:48 ***    \n",
      "Episode 300 Score: -259.15 Average Score: -189.76, Time: 00:03:06 ***    \n",
      "Episode 310 Score: -271.49 Average Score: -193.62, Time: 00:03:23 ***    \n",
      "Episode 320 Score: -280.82 Average Score: -202.53, Time: 00:03:44 ***    \n",
      "Episode 330 Score: -210.09 Average Score: -208.61, Time: 00:04:08 ***    \n",
      "Episode 340 Score: -259.50 Average Score: -220.52, Time: 00:04:34 ***    \n",
      "Episode 350 Score: -214.70 Average Score: -221.87, Time: 00:04:49 ***    \n",
      "Episode 360 Score: -229.15 Average Score: -227.43, Time: 00:05:07 ***    \n",
      "Episode 370 Score: -243.83 Average Score: -218.81, Time: 00:05:29 ***    \n",
      "Episode 380 Score: -182.94 Average Score: -218.66, Time: 00:05:52 ***    \n",
      "Episode 390 Score: -212.61 Average Score: -210.55, Time: 00:06:12 ***    \n",
      "Episode 400 Score: -162.84 Average Score: -201.60, Time: 00:06:32 ***    \n",
      "Episode 410 Score: -220.86 Average Score: -197.62, Time: 00:06:53 ***    \n",
      "Episode 420 Score: -147.89 Average Score: -190.76, Time: 00:07:13 ***    \n",
      "Episode 430 Score: -228.78 Average Score: -181.13, Time: 00:07:28 ***    \n",
      "Episode 440 Score: -137.34 Average Score: -170.70, Time: 00:07:41 ***    \n",
      "Episode 450 Score: -194.97 Average Score: -173.99, Time: 00:08:02 ***    \n",
      "Episode 460 Score: -133.20 Average Score: -167.62, Time: 00:08:22 ***    \n",
      "Episode 470 Score: -139.60 Average Score: -164.12, Time: 00:08:45 ***    \n",
      "Episode 480 Score: -200.71 Average Score: -163.67, Time: 00:09:03 ***    \n",
      "Episode 490 Score: -125.02 Average Score: -161.13, Time: 00:09:21 ***    \n",
      "Episode 500 Score: -177.69 Average Score: -158.62, Time: 00:09:45 ***    \n",
      "Episode 510 Score: -124.54 Average Score: -155.43, Time: 00:10:09 ***    \n",
      "Episode 520 Score: -184.53 Average Score: -153.80, Time: 00:10:30 ***    \n",
      "Episode 530 Score: -115.08 Average Score: -153.55, Time: 00:10:49 ***    \n",
      "Episode 540 Score: -198.40 Average Score: -155.00, Time: 00:11:07 ***    \n",
      "Episode 550 Score: -157.76 Average Score: -148.96, Time: 00:11:27 ***    \n",
      "Episode 560 Score: -169.30 Average Score: -148.96, Time: 00:11:47 ***    \n",
      "Episode 570 Score: -258.91 Average Score: -147.74, Time: 00:12:04 ***    \n",
      "Episode 580 Score: -179.33 Average Score: -142.79, Time: 00:12:21 ***    \n",
      "Episode 590 Score: -181.90 Average Score: -143.43, Time: 00:12:40 ***    \n",
      "Episode 600 Score: -129.34 Average Score: -142.59, Time: 00:12:57 ***    \n",
      "Episode 610 Score: -52.92 Average Score: -139.28, Time: 00:13:17 ***    \n",
      "Episode 620 Score: -171.80 Average Score: -138.98, Time: 00:13:36 ***    \n",
      "Episode 630 Score: -153.32 Average Score: -138.06, Time: 00:13:54 ***    \n",
      "Episode 640 Score: -177.41 Average Score: -136.19, Time: 00:14:11 ***    \n",
      "Episode 650 Score: -163.80 Average Score: -137.61, Time: 00:14:28 ***    \n",
      "Episode 660 Score: -117.41 Average Score: -133.66, Time: 00:14:44 ***    \n",
      "Episode 670 Score: -116.40 Average Score: -131.35, Time: 00:15:02 ***    \n",
      "Episode 680 Score: -104.80 Average Score: -131.63, Time: 00:15:17 ***    \n",
      "Episode 690 Score: -127.40 Average Score: -130.55, Time: 00:15:33 ***    \n",
      "Episode 700 Score: -131.28 Average Score: -129.78, Time: 00:15:47 ***    \n",
      "Episode 710 Score: -72.89 Average Score: -130.63, Time: 00:16:03 ***    \n",
      "Episode 720 Score: -155.01 Average Score: -128.67, Time: 00:16:19 ***    \n",
      "Episode 730 Score: -171.12 Average Score: -129.18, Time: 00:16:39 ***    \n",
      "Episode 740 Score: -92.52 Average Score: -130.68, Time: 00:16:56 ***    \n",
      "Episode 750 Score: -152.77 Average Score: -130.04, Time: 00:17:16 ***    \n",
      "Episode 760 Score: -161.88 Average Score: -132.73, Time: 00:17:39 ***    \n",
      "Episode 770 Score: -145.85 Average Score: -136.35, Time: 00:18:07 ***    \n",
      "Episode 780 Score: -110.49 Average Score: -136.02, Time: 00:18:34 ***    \n",
      "Episode 790 Score: -89.55 Average Score: -139.18, Time: 00:18:59 ***    \n",
      "Episode 800 Score: -157.04 Average Score: -140.64, Time: 00:19:29 ***    \n",
      "Episode 810 Score: -128.20 Average Score: -141.58, Time: 00:19:53 ***    \n",
      "Episode 820 Score: -104.94 Average Score: -144.09, Time: 00:20:17 ***    \n",
      "Episode 830 Score: -140.25 Average Score: -144.15, Time: 00:20:40 ***    \n",
      "Episode 840 Score: -201.39 Average Score: -143.55, Time: 00:21:11 ***    \n",
      "Episode 850 Score: -142.50 Average Score: -146.98, Time: 00:21:42 ***    \n",
      "Episode 860 Score: -176.22 Average Score: -149.82, Time: 00:22:15 ***    \n",
      "Episode 870 Score: -157.50 Average Score: -148.27, Time: 00:22:44 ***    \n",
      "Episode 880 Score: -155.67 Average Score: -147.56, Time: 00:23:06 ***    \n",
      "Episode 890 Score: -144.04 Average Score: -147.21, Time: 00:23:44 ***    \n",
      "Episode 900 Score: -134.22 Average Score: -147.56, Time: 00:24:25 ***    \n",
      "Episode 910 Score: -98.63 Average Score: -150.73, Time: 00:25:35 ***    \n",
      "Episode 920 Score: -224.93 Average Score: -150.81, Time: 00:26:20 ***    \n",
      "Episode 930 Score: -208.88 Average Score: -152.63, Time: 00:27:23 ***    \n",
      "Episode 940 Score: -98.11 Average Score: -156.17, Time: 00:28:57 ***    \n",
      "Episode 950 Score: -78.33 Average Score: -154.65, Time: 00:30:32 ***    \n",
      "Episode 960 Score: -67.88 Average Score: -147.06, Time: 00:32:02 ***    \n",
      "Episode 970 Score: -144.09 Average Score: -143.19, Time: 00:33:30 ***    \n",
      "Episode 980 Score: -92.77 Average Score: -140.78, Time: 00:34:59 ***    \n",
      "Episode 990 Score: -105.02 Average Score: -137.45, Time: 00:36:33 ***    \n",
      "Episode 1000 Score: -140.31 Average Score: -136.94, Time: 00:38:10 ***    \n",
      "Episode 1010 Score: -124.61 Average Score: -131.99, Time: 00:39:31 ***    \n",
      "Episode 1020 Score: -137.10 Average Score: -131.54, Time: 00:40:40 ***    \n",
      "Episode 1030 Score: -133.12 Average Score: -132.15, Time: 00:41:27 ***    \n",
      "Episode 1040 Score: -176.54 Average Score: -129.23, Time: 00:41:56 ***    \n",
      "Episode 1050 Score: -144.66 Average Score: -129.36, Time: 00:42:30 ***    \n",
      "Episode 1060 Score: -105.20 Average Score: -134.65, Time: 00:42:58 ***    \n",
      "Episode 1070 Score: -84.33 Average Score: -136.59, Time: 00:43:26 ***    \n",
      "Episode 1080 Score: -122.41 Average Score: -139.93, Time: 00:44:08 ***    \n",
      "Episode 1090 Score: 121.42 Average Score: -139.14, Time: 00:44:53 ***    \n",
      "Episode 1100 Score: -72.63 Average Score: -137.60, Time: 00:45:25 ***    \n",
      "Episode 1110 Score: -181.84 Average Score: -140.11, Time: 00:46:21 ***    \n",
      "Episode 1120 Score: -89.22 Average Score: -137.32, Time: 00:47:45 ***    \n",
      "Episode 1130 Score: -40.92 Average Score: -129.66, Time: 00:49:15 ***    \n",
      "Episode 1140 Score: -74.07 Average Score: -120.89, Time: 00:50:49 ***    \n",
      "Episode 1150 Score: -105.78 Average Score: -113.52, Time: 00:52:24 ***    \n",
      "Episode 1160 Score: -118.23 Average Score: -109.88, Time: 00:54:10 ***    \n",
      "Episode 1170 Score: -98.64 Average Score: -106.55, Time: 00:55:50 ***    \n",
      "Episode 1180 Score: -188.56 Average Score: -106.76, Time: 00:57:18 ***    \n",
      "Episode 1190 Score: -87.22 Average Score: -107.51, Time: 00:58:20 ***    \n",
      "Episode 1200 Score: -104.34 Average Score: -107.83, Time: 00:59:03 ***    \n",
      "Episode 1210 Score: -114.79 Average Score: -107.05, Time: 00:59:39 ***    \n",
      "Episode 1220 Score: -144.80 Average Score: -107.11, Time: 01:00:03 ***    \n",
      "Episode 1230 Score: -103.33 Average Score: -111.71, Time: 01:00:38 ***    \n",
      "Episode 1240 Score: -63.21 Average Score: -117.27, Time: 01:01:21 ***    \n",
      "Episode 1250 Score: -123.26 Average Score: -119.62, Time: 01:02:00 ***    \n",
      "Episode 1260 Score: -112.08 Average Score: -119.49, Time: 01:02:55 ***    \n",
      "Episode 1270 Score: -61.25 Average Score: -120.98, Time: 01:03:55 ***    \n",
      "Episode 1280 Score: -128.24 Average Score: -117.95, Time: 01:04:28 ***    \n",
      "Episode 1290 Score: -87.83 Average Score: -117.98, Time: 01:05:11 ***    \n",
      "Episode 1300 Score: -126.57 Average Score: -117.31, Time: 01:05:51 ***    \n",
      "Episode 1310 Score: -143.06 Average Score: -117.05, Time: 01:07:02 ***    \n",
      "Episode 1320 Score: -216.29 Average Score: -118.55, Time: 01:08:17 ***    \n",
      "Episode 1330 Score: -210.64 Average Score: -121.43, Time: 01:09:08 ***    \n",
      "Episode 1340 Score: -167.07 Average Score: -124.18, Time: 01:10:05 ***    \n",
      "Episode 1350 Score: -90.58 Average Score: -128.24, Time: 01:10:50 ***    \n",
      "Episode 1360 Score: -119.64 Average Score: -129.51, Time: 01:11:38 ***    \n",
      "Episode 1370 Score: 12.44 Average Score: -127.08, Time: 01:13:22 ***    \n",
      "Episode 1380 Score: -62.59 Average Score: -122.63, Time: 01:15:36 ***    \n",
      "Episode 1390 Score: -14.71 Average Score: -118.59, Time: 01:18:03 ***    \n",
      "Episode 1400 Score: -154.32 Average Score: -120.37, Time: 01:20:27 ***    \n",
      "Episode 1410 Score: -115.00 Average Score: -120.53, Time: 01:22:46 ***    \n",
      "Episode 1420 Score: -86.01 Average Score: -122.15, Time: 01:25:09 ***    \n",
      "Episode 1430 Score: -103.57 Average Score: -119.26, Time: 01:27:24 ***    \n",
      "Episode 1440 Score: -84.21 Average Score: -113.78, Time: 01:29:20 ***    \n",
      "Episode 1450 Score: -148.34 Average Score: -109.73, Time: 01:31:08 ***    \n",
      "Episode 1460 Score: 86.43 Average Score: -104.03, Time: 01:32:37 ***    \n",
      "Episode 1470 Score: 210.07 Average Score: -105.29, Time: 01:34:19 ***    \n",
      "Episode 1480 Score: 153.71 Average Score: -108.24, Time: 01:35:44 ***    \n",
      "Episode 1490 Score: -99.24 Average Score: -100.43, Time: 01:37:14 ***    \n",
      "Episode 1500 Score: -117.89 Average Score: -85.24, Time: 01:38:32 ***    \n",
      "Episode 1510 Score: -29.17 Average Score: -79.45, Time: 01:40:19 ***    \n",
      "Episode 1520 Score: -86.34 Average Score: -70.14, Time: 01:42:08 ***    \n",
      "Episode 1530 Score: -119.34 Average Score: -62.98, Time: 01:43:54 ***    \n",
      "Episode 1540 Score: -40.16 Average Score: -56.03, Time: 01:45:30 ***    \n",
      "Episode 1550 Score: -202.44 Average Score: -48.92, Time: 01:47:25 ***    \n",
      "Episode 1560 Score: -97.10 Average Score: -52.65, Time: 01:49:07 ***    \n",
      "Episode 1570 Score: -20.31 Average Score: -48.02, Time: 01:50:41 ***    \n",
      "Episode 1580 Score: -95.02 Average Score: -40.88, Time: 01:52:19 ***    \n",
      "Episode 1590 Score: -112.65 Average Score: -39.31, Time: 01:53:43 ***    \n",
      "Episode 1600 Score: -88.87 Average Score: -43.20, Time: 01:55:31 ***    \n",
      "Episode 1610 Score: -235.18 Average Score: -47.27, Time: 01:57:28 ***    \n",
      "Episode 1620 Score: -143.01 Average Score: -53.85, Time: 01:59:38 ***    \n",
      "Episode 1630 Score: -117.13 Average Score: -63.45, Time: 02:01:35 ***    \n",
      "Episode 1640 Score: -132.60 Average Score: -76.24, Time: 02:03:48 ***    \n",
      "Episode 1650 Score: -140.16 Average Score: -86.29, Time: 02:05:59 ***    \n",
      "Episode 1660 Score: -153.38 Average Score: -90.73, Time: 02:08:12 ***    \n",
      "Episode 1670 Score: -184.79 Average Score: -98.70, Time: 02:10:11 ***    \n",
      "Episode 1680 Score: -173.08 Average Score: -109.81, Time: 02:12:21 ***    \n",
      "Episode 1690 Score: -100.82 Average Score: -123.17, Time: 02:14:36 ***    \n",
      "Episode 1700 Score: -98.32 Average Score: -129.71, Time: 02:16:51 ***    \n",
      "Episode 1710 Score: -28.51 Average Score: -126.24, Time: 02:19:14 ***    \n",
      "Episode 1720 Score: -82.65 Average Score: -117.41, Time: 02:21:32 ***    \n",
      "Episode 1730 Score: -41.78 Average Score: -103.62, Time: 02:23:44 ***    \n",
      "Episode 1740 Score: -117.33 Average Score: -89.70, Time: 02:25:28 ***    \n",
      "Episode 1750 Score: -98.44 Average Score: -83.04, Time: 02:26:59 ***    \n",
      "Episode 1760 Score: -76.29 Average Score: -72.06, Time: 02:28:11 ***    \n",
      "Episode 1770 Score: -17.51 Average Score: -65.04, Time: 02:29:36 ***    \n",
      "Episode 1780 Score: -0.26 Average Score: -65.26, Time: 02:31:42 ***    \n",
      "Episode 1790 Score: -80.81 Average Score: -57.91, Time: 02:34:01 ***    \n",
      "Episode 1800 Score: -51.32 Average Score: -51.28, Time: 02:36:02 ***    \n",
      "Episode 1810 Score: -182.27 Average Score: -51.74, Time: 02:37:54 ***    \n",
      "Episode 1820 Score: -94.31 Average Score: -54.50, Time: 02:40:09 ***    \n",
      "Episode 1830 Score: -320.71 Average Score: -66.86, Time: 02:42:09 ***    \n",
      "Episode 1840 Score: 156.51 Average Score: -71.37, Time: 02:44:16 ***    \n",
      "Episode 1850 Score: -76.33 Average Score: -68.66, Time: 02:46:11 ***    \n",
      "Episode 1860 Score: -103.21 Average Score: -76.23, Time: 02:48:10 ***    \n",
      "Episode 1870 Score: 163.21 Average Score: -76.01, Time: 02:50:17 ***    \n",
      "Episode 1880 Score: -57.51 Average Score: -66.91, Time: 02:52:32 ***    \n",
      "Episode 1890 Score: -84.87 Average Score: -68.30, Time: 02:54:47 ***    \n",
      "Episode 1900 Score: -38.04 Average Score: -74.87, Time: 02:57:12 ***    \n",
      "Episode 1910 Score: 3.08 Average Score: -70.11, Time: 02:59:07 ***    \n",
      "Episode 1920 Score: 117.05 Average Score: -64.34, Time: 03:01:45 ***    \n",
      "Episode 1930 Score: 194.77 Average Score: -39.28, Time: 03:03:55 ***    \n",
      "Episode 1940 Score: -301.78 Average Score: -47.98, Time: 03:05:44 ***    \n",
      "Episode 1950 Score: 198.61 Average Score: -29.82, Time: 03:07:19 ***    \n",
      "Episode 1960 Score: 231.85 Average Score: -5.80, Time: 03:08:44 ***    \n",
      "Episode 1970 Score: 197.12 Average Score: -1.29, Time: 03:10:33 ***    \n",
      "Episode 1980 Score: 188.92 Average Score: 18.44, Time: 03:12:05 ***    \n",
      "Episode 1990 Score: -44.35 Average Score: 25.63, Time: 03:13:49 ***    \n",
      "Episode 2000 Score: -121.99 Average Score: 24.14, Time: 03:15:50 ***    \n",
      "Episode 2010 Score: 138.29 Average Score: 28.06, Time: 03:17:54 ***    \n",
      "Episode 2020 Score: -105.04 Average Score: 18.11, Time: 03:19:59 ***    \n",
      "Episode 2030 Score: -138.74 Average Score: -1.26, Time: 03:21:53 ***    \n",
      "Episode 2040 Score: -105.37 Average Score: 4.06, Time: 03:23:38 ***    \n",
      "Episode 2050 Score: -149.30 Average Score: -27.93, Time: 03:25:43 ***    \n",
      "Episode 2060 Score: -136.57 Average Score: -54.87, Time: 03:28:14 ***    \n",
      "Episode 2070 Score: -114.78 Average Score: -66.25, Time: 03:30:31 ***    \n",
      "Episode 2080 Score: -105.47 Average Score: -93.93, Time: 03:32:56 ***    \n",
      "Episode 2090 Score: 150.28 Average Score: -102.59, Time: 03:35:10 ***    \n",
      "Episode 2100 Score: 115.05 Average Score: -101.20, Time: 03:37:24 ***    \n",
      "Episode 2110 Score: -6.47 Average Score: -101.18, Time: 03:39:36 ***    \n",
      "Episode 2120 Score: 104.72 Average Score: -78.81, Time: 03:41:35 ***    \n",
      "Episode 2130 Score: -64.04 Average Score: -68.53, Time: 03:43:57 ***    \n",
      "Episode 2140 Score: -15.13 Average Score: -45.86, Time: 03:45:54 ***    \n",
      "Episode 2150 Score: -1.21 Average Score: -16.00, Time: 03:47:58 ***    \n",
      "Episode 2160 Score: -35.04 Average Score: 0.13, Time: 03:50:29 ***    \n",
      "Episode 2170 Score: -24.19 Average Score: 19.93, Time: 03:52:44 ***    \n",
      "Episode 2180 Score: -67.10 Average Score: 34.61, Time: 03:55:19 ***    \n",
      "Episode 2190 Score: 197.47 Average Score: 58.48, Time: 03:56:48 ***    \n",
      "Episode 2200 Score: -51.98 Average Score: 80.50, Time: 03:58:11 ***    \n",
      "Episode 2210 Score: 127.73 Average Score: 87.22, Time: 03:59:44 ***    \n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode 2220 Score: 191.72 Average Score: 79.75, Time: 04:01:23 ***    \n",
      "Episode 2230 Score: -80.08 Average Score: 70.45, Time: 04:03:34 ***    \n",
      "Episode 2240 Score: -72.91 Average Score: 56.07, Time: 04:05:24 ***    \n",
      "Episode 2250 Score: -44.07 Average Score: 42.13, Time: 04:07:11 ***    \n",
      "Episode 2260 Score: -79.20 Average Score: 38.47, Time: 04:09:10 ***    \n",
      "Episode 2270 Score: 153.42 Average Score: 31.77, Time: 04:11:08 ***    \n",
      "Episode 2280 Score: 192.13 Average Score: 25.83, Time: 04:13:17 ***    \n",
      "Episode 2290 Score: -90.95 Average Score: 6.51, Time: 04:15:23 ***    \n",
      "Episode 2300 Score: -42.49 Average Score: -5.04, Time: 04:17:12 ***    \n",
      "Episode 2310 Score: 141.57 Average Score: -2.20, Time: 04:18:31 ***    \n",
      "Episode 2320 Score: 174.04 Average Score: 6.91, Time: 04:19:56 ***    \n",
      "Episode 2330 Score: -57.79 Average Score: 17.63, Time: 04:21:17 ***    \n",
      "Episode 2340 Score: 201.17 Average Score: 30.01, Time: 04:22:35 ***    \n",
      "Episode 2350 Score: 201.22 Average Score: 47.50, Time: 04:23:30 ***    \n",
      "Episode 2360 Score: 240.76 Average Score: 69.98, Time: 04:24:22 ***    \n",
      "Episode 2370 Score: 134.10 Average Score: 86.77, Time: 04:25:40 ***    \n",
      "Episode 2380 Score: 180.13 Average Score: 108.76, Time: 04:26:54 ***    \n",
      "Episode 2390 Score: 207.30 Average Score: 126.68, Time: 04:28:25 ***    \n",
      "Episode 2400 Score: 213.40 Average Score: 139.56, Time: 04:29:42 ***    \n",
      "Episode 2410 Score: 197.53 Average Score: 148.26, Time: 04:30:41 ***    \n",
      "Episode 2420 Score: 185.83 Average Score: 150.40, Time: 04:31:43 ***    \n",
      "Episode 2430 Score: 209.83 Average Score: 163.73, Time: 04:32:54 ***    \n",
      "Episode 2440 Score: 254.22 Average Score: 173.04, Time: 04:33:58 ***    \n",
      "Episode 2450 Score: 78.12 Average Score: 171.80, Time: 04:35:09 ***    \n",
      "Episode 2460 Score: 146.00 Average Score: 163.70, Time: 04:36:35 ***    \n",
      "Episode 2470 Score: 206.51 Average Score: 165.91, Time: 04:37:34 ***    \n",
      "Episode 2480 Score: 208.59 Average Score: 167.33, Time: 04:38:31 ***    \n",
      "Episode 2490 Score: 203.29 Average Score: 169.14, Time: 04:39:47 ***    \n",
      "Episode 2500 Score: 183.03 Average Score: 175.99, Time: 04:40:47 ***    \n",
      "Episode 2510 Score: 269.72 Average Score: 179.79, Time: 04:41:51 ***    \n",
      "Episode 2520 Score: 241.65 Average Score: 186.09, Time: 04:42:49 ***    \n",
      "Episode 2530 Score: 261.49 Average Score: 190.14, Time: 04:43:42 ***    \n",
      "Episode 2540 Score: 276.92 Average Score: 189.52, Time: 04:44:36 ***    \n",
      "Episode 2550 Score: 216.88 Average Score: 195.36, Time: 04:45:21 ***    \n",
      "Episode 2559 Score: 209.97 Average Score: 202.45, Time: 04:46:12 ***    \n",
      "Environment solved !   \n"
     ]
    }
   ],
   "source": [
    "def ddpg(n_episodes=20000, print_every=10):\n",
    "    scores_deque = deque(maxlen=100)\n",
    "    scores_array = []\n",
    "    avg_scores_array = [] \n",
    "        \n",
    "    time_start = time.time()\n",
    "    \n",
    "    timestep_after_last_save = 0\n",
    "    total_timesteps = 0\n",
    "        \n",
    "    for i_episode in range(1, n_episodes+1):\n",
    "        state = env.reset()                                    # set the environment    \n",
    "        agent.reset()\n",
    "        score_average = 0\n",
    "        \n",
    "        timestep = 0\n",
    "        total_reward = 0\n",
    "        \n",
    "        done = False\n",
    "\n",
    "        while True:\n",
    "            action = agent.act(state)\n",
    "                        \n",
    "            # Perform action\n",
    "            next_state, reward, done, _ = env.step(action) \n",
    "            done_bool = 0 if timestep + 1 == env._max_episode_steps else float(done)\n",
    "            total_reward += reward                          # full episode reward\n",
    "        \n",
    "            ## def step(self, states, actions, rewards, next_states, dones, timestep):\n",
    "            agent.step(state, action, reward, next_state, done, timestep)\n",
    "            state = next_state                               # roll over states to next time step\n",
    "            \n",
    "            timestep += 1     \n",
    "            total_timesteps += 1\n",
    "            timestep_after_last_save += 1\n",
    "\n",
    "            if done:                                  # exit loop if episode finished\n",
    "                break\n",
    "        \n",
    "        scores_deque.append(total_reward)\n",
    "        scores_array.append(total_reward)\n",
    "\n",
    "        avg_score = np.mean(scores_deque)\n",
    "        avg_scores_array.append(avg_score)\n",
    "        \n",
    "        # train_by_episode(time_start, i_episode) \n",
    "        s = (int)(time.time() - time_start)\n",
    "                        \n",
    "        if i_episode % print_every == 0 or (len(scores_deque) == 100 and np.mean(scores_deque) >= threshold) :\n",
    "            #torch.save(agent.actor_local.state_dict(), 'checkpoint_actor.pth')\n",
    "            #torch.save(agent.critic_local.state_dict(), 'checkpoint_critic.pth')\n",
    "            s = (int)(time.time() - time_start) \n",
    "            print('Episode {} Score: {:.2f} Average Score: {:.2f}, Time: {:02}:{:02}:{:02} ***    '\\\n",
    "                  .format(i_episode, total_reward, avg_score, s//3600, s%3600//60, s%60))  \n",
    "            \n",
    "        if len(scores_deque) == 100 and np.mean(scores_deque) >= threshold:  \n",
    "            print('Environment solved !   ')\n",
    "            break\n",
    "            \n",
    "    return scores_array, avg_scores_array\n",
    "\n",
    "scores, avg_scores = ddpg()\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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vffeqxEeHm7avXv3vry8PNGxY8emt9xySxbArl27qm3btm13UlJSYY8ePRrPnDkz8t5777XfZcybNy+sdu3ahj///POQ9XpaT6/zySefTH/00UcTli1bdqB58+YFgwYNsudxePbZZ+v07t0764cffkg9f/68tkOHDs0GDx6c9eGHH8Y88sgjZx9++OGM/Px8YTT6VlFCWWoUPmPbaiguXv4u+Wts6+DVJN2+31Q+hY8nL3LJFu9ERQja1QfTK+yz5TjbD/44xAMzPTtDl8SNms2kBo0hNWgMMfi+feeIkGY+0E+lmijgfsOTXMQiZnwRJa8MbYG+WF4hZakpme+//z5q9OjRFwFGjBiRYduCGjlyZOa6devC8vLyxNy5c8M7deqUHRoaKtetWxc6evToDICOHTvmJyUluaRY37FjR1BcXFxBq1atCgDuueeeC2vWrKluOz5mzJiLAJ06dco9fvy41xYJd9uk7oSuJ5YvXx72/fffRzdt2jS5bdu2zS5evKjbu3dvEEDLli0vJycnF+p0Om699daM1atXO2WqbNeuXd7q1avDHn744djFixeHRkdHmzy9zu3btwfFxcUVtGzZssBmUbKN8+eff4a9++67dZo2bZrcrVu3JgUFBeLQoUMBXbp0uTxlypQ6zz33XO2DBw8GhIaG+vSjoiw1Cr/xdAdeFU36FUFV8L/wlqd/3Fku43yy8jATBzR1abf9oFbEW/L95hPcd32D8h8YnFTNoXPZfg0RSCGv6L+wP98U9Aj/VziBxeaOmPDdr7Jv+pdcr93DGlNzDsvYoqk6zNUffXLVSJpSLCoVwZkzZ7QbNmwIS0lJCX700UcxmUxCCCE//vjjEyEhIfK6667LnjdvXth3330XaRMy3nz/S+sTFBQkAXQ6nTQajV7/iRISEgw2ywxAWlpaQO3atQ0A0dHRxrS0NH18fLwhLS1NHxUV5WLqkFKKKVOmHBsxYoRTDZD58+dXLy6Oij9v1apVwdatW/f++OOP4c8991zs8uXLs4YPH+5RyXsSW1JK5s6de6h169ZOhdDatWuX371798s//fRT+IABA5KmTZuWOnjwYK+/nMpSo/AZTz+oZYmAuZq42rbXroT4KunXuKxXd5cPqSIWaH+tQdP071NbXOT2wueZbewDwEcBHzBe+5sfo0muu/ATAOMN/yx2pOh98GemylDj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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure()\n",
    "ax = fig.add_subplot(111)\n",
    "plt.plot(np.arange(1, len(scores)+1), scores, label=\"Score\")\n",
    "plt.plot(np.arange(1, len(avg_scores)+1), avg_scores, label=\"Avg on 100 episodes\")\n",
    "plt.legend(bbox_to_anchor=(1.05, 1)) \n",
    "plt.ylabel('Score')\n",
    "plt.xlabel('Episodes #')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "def save(agent, filename, directory):\n",
    "    torch.save(agent.actor_local.state_dict(), '%s/%s_actor_local.pth' % (directory, filename))\n",
    "    torch.save(agent.actor_target.state_dict(), '%s/%s_actor_target.pth' % (directory, filename))\n",
    "    torch.save(agent.critic_local.state_dict(), '%s/%s_critic_local.pth' % (directory, filename))\n",
    "    torch.save(agent.critic_target.state_dict(), '%s/%s_critic_target.pth' % (directory, filename))\n",
    "\n",
    "\n",
    "save(agent, 'LunarLanderContinuous-v2', 'dir_chk_2')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "ml2-kernel",
   "language": "python",
   "name": "ml2-kernel"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
